<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>表达式</title>
<link media="all" rel="stylesheet" type="text/css" href="styles/03e73060321a0a848018724a6c83de7f-theme-base.css" />
<link media="all" rel="stylesheet" type="text/css" href="styles/03e73060321a0a848018724a6c83de7f-theme-medium.css" />

 </head>
 <body class="docs"><div class="navbar navbar-fixed-top">
  <div class="navbar-inner clearfix">
    <ul class="nav" style="width: 100%">
      <li style="float: left;"><a href="language.constants.magic.html">« 魔术常量</a></li>
      <li style="float: right;"><a href="language.operators.html">运算符 »</a></li>
    </ul>
  </div>
</div>
<div id="breadcrumbs" class="clearfix">
  <ul class="breadcrumbs-container">
    <li><a href="index.html">PHP Manual</a></li>
    <li><a href="langref.html">语言参考</a></li>
    <li>表达式</li>
  </ul>
</div>
<div id="layout">
  <div id="layout-content"><div id="language.expressions" class="chapter">
   <h1>表达式</h1>

   <p class="simpara">
    表达式是 PHP 最重要的构建部分。在 PHP
    中，几乎所写的任何东西都是表达式。简单但却最精确的定义表达式的方式就是“任何有值的东西”。
   </p>
   <p class="simpara">
    最基本的表达式形式是常量和变量。当键入 <code class="code">$a = 5</code>，即值 <code class="code">5</code> 将分配给变量
    <var class="varname">$a</var>。很明显，<code class="code">5</code>的值为 5，换句话说 <code class="code">5</code> 是一个值为 5
    的表达式（在这里，<code class="code">5</code> 是一个整型常量）。
   </p>
   <p class="simpara">
    赋值之后，期待 <var class="varname">$a</var> 的值为 5，因而如果写下
    <code class="code">$b = $a</code>，则期望其行为就像 <code class="code">$b = 5</code> 一样。换句话说，<var class="varname">$a</var> 也是值为 5
    的表达式。如果一切正确，那这正是将要发生的事情。
   </p>
   <p class="para">
    稍微复杂的表达式例子就是函数。例如，考虑以下函数：
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">foo&nbsp;</span><span style="color: #007700">()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">5</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>
   </p>
   <p class="simpara">
    假如已经熟悉了函数的概念（如果没有，请查看<a href="language.functions.html" class="link">函数</a>的相关章节），那么本质上键入
    <code class="code">$c = foo()</code> 就如同写下
    <code class="code">$c = 5</code>，这是对的。函数是具有返回值的表达式。由于 <code class="code">foo()</code>
    返回 5，表达式“<code class="code">foo()</code>”的值也是 5。通常函数不仅会返回静态值，还会计算一些东西。
   </p>

   <p class="simpara">
    当然，PHP 中的值并非都是整型的。PHP
    支持四种标量值（标量值不能拆分为更小的单元，例如，和数组不同）类型：<span class="type">int</span>
    值、浮点数值（<span class="type">float</span>）、<span class="type">string</span> 值和 <span class="type">bool</span> 值。PHP
    也支持两种复合类型：数组和对象。这些值类型可以赋值给变量或者从函数返回。
   </p>

   <p class="simpara">
    PHP 和其它语言一样在表达式的道路上发展，但推进得更深远。PHP
    是一种面向表达式的语言，从这一方面来讲几乎一切都是表达式。考虑刚才已经研究过的例子
    <code class="code">$a = 5</code>。很显然这里涉及到两个值，整数常量
    <code class="code">5</code> 的值以及变量 <var class="varname">$a</var>
    的值，也被更新为 5。但事实是这里还涉及到一个额外的值，即附值语句本身的值。赋值语句本身求值为被赋的值，即
    5。实际上这意味着 <code class="code">$a = 5</code>，无论做什么，都是一个值为 5
    的表达式。因此编写 <code class="code">$b = ($a = 5)</code> 跟编写
    <code class="code">$a = 5; $b = 5;</code>（分号标志着语句的结束）是一样的。因为赋值操作的顺序是由右到左的，也可以写成
    <code class="code">$b = $a = 5</code>。
   </p>

   <p class="simpara">
    另外一个很好的面向表达式的例子就是前、后递增和递减。PHP
    和多数其它语言的用户应该比较熟悉 <code class="code">variable++</code> 和 <code class="code">variable--</code> 符号。即<a href="language.operators.increment.html" class="link">递增和递减运算符</a>。在 PHP 和 C
    语言中，有两种类型的递增——前递增和后递增。本质上来讲，前递增和后递增均增加了变量的值，并且对于变量的影响是相同的。不同的是递增表达式的值。前递增，写做
    <code class="code">++$variable</code>，求增加后的值（PHP 在读取变量的值之前，增加变量的值，因而称之为“前递增”）。后递增，写做
    <code class="code">$variable++</code>，求 <var class="varname">$variable</var> 未递增之前的原始值（PHP
    在读取变量的值之后，增加变量的值，因而叫做“后递增”）。
   </p>

   <p class="simpara">
    一个常用到的表达式类型是<a href="language.operators.comparison.html" class="link">比较表达式</a>。这些表达式求值
    <strong><code>false</code></strong> 或 <strong><code>true</code></strong>。PHP
    支持 &gt;（大于）、&gt;=（大于等于）、==（等于）、!=（不等于）、&lt;（小于）、&lt;= (小于等于)。PHP
    还支持全等运算符 ===（值和类型均相同）和非全等运算符
    !==（值或者类型不同）。这些表达式都是在条件判断语句，比如 <code class="code">if</code>。
   </p>

   <p class="simpara">
    这里，将要研究的最后一个例子是组合的运算赋值表达式。已经知道如果想要为变量 <var class="varname">$a</var>
    加 1，可以简单的写 <code class="code">$a++</code> 或者 <code class="code">++$a</code>。但是如果想为变量增加大于
    1 的值，比如 3，该怎么做？可以写 <code class="code">$a++</code> 多次，但这样明显不是一种高效舒适的方法，一个更加通用的做法是 <code class="code">$a =
    $a + 3</code>。<code class="code">$a + 3</code> 计算 <var class="varname">$a</var> 加上 3 的值，并将其赋予给
    <var class="varname">$a</var>，于是 <var class="varname">$a</var> 的值增加了 3。在 PHP 及其它几种类似 C
    的语言中，可以以一种更加简短的形式完成上述功能，随着时间的推移，会变得更加清晰、更容易理解。为
    <var class="varname">$a</var> 的当前值加 3，可以这样写 <code class="code">$a += 3</code>。这里的意思是“取变量 <var class="varname">$a</var> 的值，加
    3，得到的结果再次分配给变量 <var class="varname">$a</var>”。除了更短和清楚外，也可以加快执行速度。<code class="code">$a += 3</code>
    的值，如同一个正常赋值操作的值，是赋值后的值。注意它不是 3，而是 <var class="varname">$a</var>
    的值加上3 之后的值（此值将被赋给 <var class="varname">$a</var>）。任何二元运算符都可以用运算赋值模式，例如 
    <code class="code">$a -= 5</code>（从变量 <var class="varname">$a</var> 的值中减去 5），<code class="code">$b *= 7</code>（变量 <var class="varname">$b</var>
    乘以 7），等等。
   </p>
   <p class="para">
    还有一个表达式，如果没有在别的语言中看到过的话，可能看上去很奇怪，即三元条件运算符：
   </p>
   <p class="para">
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$first&nbsp;</span><span style="color: #007700">?&nbsp;</span><span style="color: #0000BB">$second&nbsp;</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">$third<br />?&gt;</span>
</span>
</code></div>
     </div>

    </div>
   </p>
   <p class="para">
    如果第一个子表达式的值是 <strong><code>true</code></strong>（非零），那么计算第二个子表达式的值，其值即为整个表达式的值。否则，将第三个子表达式的值作为整个表达式的值。
   </p>
   <p class="para">
    下面的例子有助于更好的理解前、后递增和表达式：
   </p>
   <p class="para">
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">double</span><span style="color: #007700">(</span><span style="color: #0000BB">$i</span><span style="color: #007700">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$i</span><span style="color: #007700">*</span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">$b&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$a&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">5</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/*&nbsp;赋值&nbsp;5&nbsp;到变量&nbsp;$a&nbsp;和&nbsp;$b&nbsp;*/<br /></span><span style="color: #0000BB">$c&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/*&nbsp;后自增，将&nbsp;$a（5）的原始值赋给&nbsp;$c&nbsp;*/<br /></span><span style="color: #0000BB">$e&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$d&nbsp;</span><span style="color: #007700">=&nbsp;++</span><span style="color: #0000BB">$b</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/*&nbsp;前自增，将&nbsp;$b（6）的递增值赋给&nbsp;$d&nbsp;和&nbsp;$e&nbsp;*/<br /><br />/*&nbsp;此时，&nbsp;$d&nbsp;和&nbsp;$e&nbsp;都等于&nbsp;6&nbsp;*/<br /><br /></span><span style="color: #0000BB">$f&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">double</span><span style="color: #007700">(</span><span style="color: #0000BB">$d</span><span style="color: #007700">++);&nbsp;&nbsp;</span><span style="color: #FF8000">/*&nbsp;自增前将两倍值赋值给&nbsp;$d&nbsp;，即&nbsp;2*6&nbsp;=&nbsp;12&nbsp;赋值给&nbsp;$f&nbsp;*/<br /></span><span style="color: #0000BB">$g&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">double</span><span style="color: #007700">(++</span><span style="color: #0000BB">$e</span><span style="color: #007700">);&nbsp;&nbsp;</span><span style="color: #FF8000">/*&nbsp;自增后将两倍值赋值给&nbsp;$e&nbsp;，即&nbsp;2*7&nbsp;=&nbsp;14&nbsp;赋值给&nbsp;$g&nbsp;*/<br /></span><span style="color: #0000BB">$h&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$g&nbsp;</span><span style="color: #007700">+=&nbsp;</span><span style="color: #0000BB">10</span><span style="color: #007700">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/*&nbsp;首先，$g&nbsp;自增&nbsp;10&nbsp;后等于&nbsp;24。然后将值（24）赋值给了&nbsp;$h，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$h&nbsp;的值也等于&nbsp;24。&nbsp;*/<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
     </div>

    </div>
   </p>
   <p class="simpara">
    一些表达式可以被当成语句。这时，一条语句的形式是 &#039;<code class="code">expr ;</code>&#039;，即一个表达式加一个分号结尾。在
    <code class="code">$b = $a = 5;</code> 中，<code class="code">$a = 5</code>
    是一个有效的表达式，但它本身不是一条语句。<code class="code">$b = $a = 5;</code> 是一条有效的语句。
   </p>
   <p class="simpara">
    最后一件值得提起的事情就是表达式的真假值。在许多事件中，主要是在条件执行和循环中，不要关心表达式中的具体值，反而要注意表达式的值是否是
    <strong><code>true</code></strong> 或者 <strong><code>false</code></strong>。常量 <strong><code>true</code></strong> 和 <strong><code>false</code></strong>（大小写无关）是两种可能的
    布尔值。必要时，表达式将自动转换为布尔值。参见<a href="language.types.type-juggling.html#language.types.typecasting" class="link">类型强制转换</a>获取详细信息。
   </p>
   <p class="simpara">
    PHP 提供了一套完整强大的表达式实现，并且完全纪录它超出了本手册的范围。上面的例子帮助了解了表达式的概念以及如何构建有用的表达式。在本手册的其余部分，将编写
    <var class="varname">expr</var> 来指示任何有效的 PHP 表达式。
   </p>
  </div>
</div></div></body></html>